package arkanoid.components.ball;

import com.uqbar.vainilla.DeltaState;

import arkanoid.components.Palette;

public class DisattachedNormalBall extends DisattachedBall {
	
	@Override
	public void update(Ball ball, DeltaState deltaState) {
		super.update(ball, deltaState);
		Palette palette = ball.getScene().getPalette();
		if (this.ballCollidesAgainstPalette(ball, palette)) {
			ball.setY(palette.getY() - ball.getDiameter());
			ball.setVersorJ(-ball.getVersorJ());
			if (this.collidesFromUp(ball , palette) && this.collidesFromUpMiddle(ball, palette)) {
				if (Math.abs(ball.getVersorJ()) <= 0.6 ) {
					ball.setVersorJ(ball.getVersorJ() * 2);
					ball.setVersorI(ball.getVersorI() * 0.5);
				}
			}
			if (this.collidesFromUp(ball , palette) && this.collidesFromUpLeftSide(ball, palette)) {
				if (Math.abs(ball.getVersorJ()) >= 0.4) {
					if (ball.getVersorJ() < 0) {
						ball.setVersorJ(ball.getVersorJ() * 0.5);
						ball.setVersorI(ball.getVersorI() * -1.5);
					}
					else {
						ball.setVersorJ(ball.getVersorJ() * 0.5);
						ball.setVersorI(ball.getVersorI() * 1.5);
					}
				}
			}
			if (this.collidesFromUp(ball , palette) && this.collidesFromUpRightSide(ball, palette)) {
				if (Math.abs(ball.getVersorJ()) >= 0.4) {
					if (ball.getVersorJ() < 0) {
						ball.setVersorJ(ball.getVersorJ() * 0.5);
						ball.setVersorI(ball.getVersorI() * 1.5);
					}
					else {
						ball.setVersorJ(ball.getVersorJ() * 0.5);
						ball.setVersorI(ball.getVersorI() * -1.5);
					}
				}
			}
		}
	}

	private boolean collidesFromUp(Ball ball, Palette palette) {
		return !(ball.getY() + ball.getRatio() >= palette.getY() + palette.getHeight());
	}
	
	private boolean collidesFromUpMiddle(Ball ball, Palette palette) {
		return (ball.getX() >= palette.getX() + palette.getWidth() * 15 / 100
				&& ball.getX() <= palette.getX() + palette.getWidth() * 85 / 100);
	}
	
	private boolean collidesFromUpLeftSide(Ball ball, Palette palette) {
		return (ball.getX() >= palette.getX() && ball.getX() < palette.getX() + palette.getWidth() * 15 / 100);
	}
	
	private boolean collidesFromUpRightSide(Ball ball, Palette palette) {
		return (ball.getX() > palette.getX() + palette.getWidth() * 85 / 100
				&& ball.getX() <= palette.getX() + palette.getWidth());
	}
}
